package com.galeno.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author galeno
 * @Title:
 * @Description: hdfs中的API练习
 * @date 2021/7/2221:47
 */
public class HdfsAPIDemo {
    public static void main(String[] args) throws IOException, InterruptedException {
        //设置客户端的登录名为root
        System.setProperty("HADOOP_USER_NAME","root");
        //构建客户端对象
        Configuration conf = new Configuration();
        // 这样会覆盖掉之前从文件中加载的参数值
        conf.set("dfs.replication","2");
        conf.set("fs.defaultFS","hdfs://galeno01:8020/");
        FileSystem fs = FileSystem.get(conf);
        //false即不进行迭代获取多层
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fs.listFiles(new Path("/"), false);
        // LocatedFileStatus封装了一个文件的各种属性信息（元信息）
        LocatedFileStatus fileStatus  = locatedFileStatusRemoteIterator.next();
        System.out.println("文件路径： " + fileStatus.getPath());
        System.out.println("文件长度： " + fileStatus.getLen());
        System.out.println("文件所有者： " + fileStatus.getOwner());
        System.out.println("文件所属组： " + fileStatus.getGroup());
        System.out.println("文件切块规格： " + fileStatus.getBlockSize());
        System.out.println("文件副本数量： " + fileStatus.getReplication());
        System.out.println("文件块信息： " + Arrays.asList(fileStatus.getBlockLocations()));
        HdfsAPIDemo ha=new HdfsAPIDemo();
        ha.uploadtoHdfs();
        ha.downloadDemoTest();
        ha.creadDeleteRnameMovceAndBoolan();



    }

    /**
     * 上传文件到hdfs
     * 参数说明(1.是否删除源文件,2.若目标文件重复,是否覆盖,3.要上传的文件(可以为path数组,传多个文件),4.要上传的目标路径)
     */
    public void uploadtoHdfs() throws IOException {
        FileSystem fs = getFileSystem();
        fs.copyFromLocalFile(false,true, new Path[]{new Path("d:/开发需要/FeiQ.exe"), new Path("d:/开发需要/TIM.exe")},new Path("/myself"));
        System.out.println("上传成功");

    }
    /**
     * 下载文件到本地
     */
    public void downloadDemoTest() throws IOException {
        FileSystem fs = getFileSystem();
        fs.copyToLocalFile(new Path("/wc.txt"),new Path("e:/hdfstest"));
        File file=new File("e:"+File.separator+"hdfs.test"+File.separator+"wc.txt");
        if (file.exists()){
            System.out.println("文件下载成功");
        }

    }
    /**
     * 获取FileSystem
     */
    public static FileSystem getFileSystem() throws IOException {
        System.setProperty("HADOOP_USER_NAME","root");
        Configuration conf = new Configuration();
       // conf.set("fs.defaultFS","hdfs://galeno01:8020/");
        return FileSystem.get(conf);
    }
    /**
     * 创建文件夹,删除文件夹(或者文件),重命名,移动文件夹,以及判断文件夹是否存在
     */
    public void creadDeleteRnameMovceAndBoolan() throws IOException, InterruptedException {
        FileSystem fs = getFileSystem();
        String strDir1="/我爱中国";
        String strDir2="/apple";
        if(fs.mkdirs(new Path(strDir1))){
            System.out.println("文件夹创建成功");
        }
        if(fs.mkdirs(new Path(strDir2))){
            System.out.println("文件夹创建成功");
        }
        Thread.sleep(1000);
        /**
         * 删除文件夹
         */
        if(fs.exists(new Path(strDir2))){
           if(fs.delete(new Path(strDir2),true)){
               System.out.println("文件删除成功");
           }
        }else{
            System.out.println("文件或文件夹不存在,删除是失败");
        }
        /**
         * 重命名
         */
        Path srcPath=new Path("/test");
        Path objPath=new Path("/testrename");

        if(fs.rename(srcPath,objPath)){
            System.out.println("文件改名成功");
        }
        /**
         * 移动文件
         */
        //要移动的文件
        Path srcPath1=new Path("/b.txt");
        //移动的位置
        Path objPath1=new Path("/aaa");
        if (fs.rename(srcPath1,objPath1)) {
            System.out.println("文件改名成功");
        }





    }





}
